# 作者： 李泉志
# 2025年01月13日21时07分秒
# 2947029073@qq.com
"""
re 模块操作
1. re 模块的使用过程
    #coding=utf-8
    # 导入 re 模块
    import re
    # 使用 match 方法进行匹配操作
    result = re.match(正则表达式,要匹配的字符串)
    # 如果上一步匹配到数据的话，可以使用 group 方法来提取数据
    result.group()
2. 说明
    • re.match() 能够匹配出以 xxx 开头的字符串
3.匹配单个字符
.  匹配任意1个字符（除了\n）
    [ ]  匹配[ ]中列举的字符
    \d  匹配数字，即 0-9 decimal
    \D  匹配非数字，即不是数字
    \s  匹配空白，即 空格，tab 键 space
    \S  匹配非空白
    \w  匹配单词字符，即 a-z、A-Z、0-9、_ (汉字) word
    \W  匹配非单词字符

4.匹配多个字符
    *  匹配前一个字符出现 0 次或者无限次，即可有可无
    +  匹配前一个字符出现 1 次或者无限次，即至少有 1 次
    ?  匹配前一个字符出现 1 次或者 0 次，即要么有 1 次，要么没有
    {m}  匹配前一个字符出现 m 次
    {m,n}  匹配前一个字符出现从 m 到 n 次

5.匹配开头结尾
    ^  匹配字符串开头
    $  匹配字符串结尾

6.匹配分组
    |   匹配左右任意一个表达式
    (ab)    将括号中字符作为一个分组
    \num    引用分组 num 匹配到的字符串
    (?P<name>)  分组起别名
    (?P=name)    引用别名为 name 分组匹配到的字符串
"""

import re


def simple():
    result = re.match("wangdao", "wangdao.cn")
    if result:
        print(result.group())


def single():
    ret = re.match(".", "M")
    print(ret.group())

    ret = re.match("t.o", "too")
    print(ret.group())

    ret = re.match("t.o", "two")
    print(ret.group())
    print('-' * 50)

    # 大小写 h 都可以的情况
    ret = re.match("[hH]", "hello Python")
    print(ret.group())
    ret = re.match("[hH]", "Hello Python")
    print(ret.group())
    ret = re.match("[hH]ello Python", "Hello Python")
    print(ret.group())

    # 匹配 0 到 9 第二种写法
    ret = re.match("[0-9]Hello Python", "7Hello Python")
    print(ret.group())
    ret = re.match("[0-35-9]Hello Python", "7Hello Python")  # 0-3,5-9
    print(ret.group())

    print('-' * 50)
    # 使用\d20 进行匹配
    ret = re.match(r"嫦娥\d号", "嫦娥1号发射成功")
    print(ret.group())
    ret = re.match(r"嫦娥\d号", "嫦娥2号发射成功")
    print(ret.group())
    ret = re.match(r"嫦娥\d号", "嫦娥3号发射成功")
    print(ret.group())


def multiple():
    ret = re.match("[A-Z][a-z]*", "M")
    print(ret.group())
    ret = re.match("[A-Z][a-z]*", "MnnM")
    print(ret.group())
    ret = re.match("[A-Z][a-z]*", "Aabcdef")
    print(ret.group())

    names = ["name1", "_name", "2_name", "__name__"]
    for name in names:
        ret = re.match(r"[a-zA-Z_]+\w*", name)  # 字母下划线开头
        if ret:
            print(f'{name} 匹配成功')
        else:
            print(f'{name} 匹配失败')

    print('-' * 50)
    ret = re.match(r"[1-9]?[0-9]", "7")  # 后一个0-9匹配到7
    print(ret.group())
    ret = re.match(r"[1-9]?\d", "33")
    print(ret.group())
    ret = re.match(r"[1-9]?\d", "09")
    print(ret.group())

    print('-' * 50)
    ret = re.match("[a-zA-Z0-9_]{6}", "12a3g45678")
    print(ret.group())
    ret = re.match("[a-zA-Z0-9_]{8,20}", "1ad12f23s34455ff66")  # 能多则多
    print(ret.group())
    # ret = re.match("[a-zA-Z0-9_]{6}", "1a*d1123")  # 个数不到6个匹配不到
    # print(ret.group())


def start_end():
    email_list = ["xiaoWang@163.com", "xiaoWang@163.comheihei", ".com.xiaowang @ qq.com"]
    for email in email_list:
        ret = re.match(r"\w{4,20}@163\.com$", email)  # 正则符号要转义
        if ret:
            print(f'{email} 匹配成功')
        else:
            print(f'{email} 匹配失败')

    print('-' * 50)


def split_group():
    # 0-100 匹配
    ret = re.match(r"[1-9]?\d$|100", "78")
    if ret:
        print(f'{ret.group()} 匹配成功')
    else:
        print(f'{ret.group()} 匹配失败')

    # 1-99匹配
    ret = re.match(r"[1-9][0-9]|[0-9]$", "9")
    if ret:
        print(f'{ret.group()} 匹配成功')
    else:
        print(f'匹配失败')
    print('-' * 50)

    ret = re.match(r"\w{4,20}@(163|126|qq)\.com$", "test@126.com")
    print(ret.group())
    print('-' * 50)

    ret = re.match(r"([^-]+)-(\d+)", "010-12345678")  # [^-]:未到-就一直吃，在[]中不是匹配开头,是非
    print(ret.group())
    print(ret.group(1))
    print(ret.group(2))
    print('-' * 50)

    ret = re.match(r"<[a-zA-Z]*>\w*</[a-zA-Z]*>", "<html>hh</htmla>")
    print(ret.group())
    # 通过引用分组中匹配到的数据即可，但是要注意是元字符串，即类似 r""这种格式
    ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
    print(ret.group())  # \1:表示引用分组1，即<html>

    labels = ["<html><h1>www.cskaoyan.com</h1></html>", "<html><h1>www.cskaoyan.com </h2> </html> "]
    for label in labels:
        ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)
    print('-' * 50)

    for label in labels:
        ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", label)
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)


if __name__ == '__main__':
    # simple()
    # single()
    # multiple()
    # start_end()
    split_group()
